package proxy;

import org.junit.Test;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import proxy.cglib.Advice;
import proxy.cglib.Target;

import java.lang.reflect.Method;

public class ProxyTest_cglib {
    //目标对象
    Target target = new Target();
    //增强对象
    Advice advice = new Advice();

    @Test
    public void testProxy(){
        //返回值是动态生成的代理对象，基于cglib
        //1.创建增强器
        Enhancer enhancer = new Enhancer();
        //2.设置父类(目标对象)
        enhancer.setSuperclass(Target.class);
        //3.设置回调方法
        enhancer.setCallback(new MethodInterceptor() {
            /**
             * 代理逻辑方法
             * 通过代理对象调用的所有方法，实质上都是执行intercept方法
             *
             * @param o 代理对象
             * @param method 代理对象调用的方法被封装为Method对象(反射)
             * @param objects 代理对象调用的方法传递的参数被封装为Object[]数组(反射)
             * @param methodProxy
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //前置增强
                advice.before();
                //执行目标对象的目标方法
                Object ret = method.invoke(target, objects);
                //后置增强
                advice.after();
                return ret;
            }
        });
        //4.生成代理对象
        Target proxy = (Target) enhancer.create();
        //5.执行代理方法
        proxy.save();
    }
}
